Ứng dụng Hợp_ngữ

Trong quá khứ

Về mặt lịch sử, đã từng có một số lượng lớn các chương trình đã được viết hoàn toàn bằng hợp ngữ. Trước khi xuất hiện ngôn ngữ C vào những năm 1970 và đầu thập niên 1980, các hệ điều hành độc quyền hầu như được viết bằng hợp ngữ. Nhiều ứng dụng thương mại cũng được viết bằng hợp ngữ, bao gồm một khối lượng lớn các phần mềm cho máy tính lớn của IBM được các tập đoàn lớn viết. Cuối cùng thì ngôn ngữ COBOLFORTRAN đã thay thế hợp ngữ mặc dù còn nhiều tổ chức vẫn giữ lại các kiến trúc ứng dụng kiểu hợp ngữ trong suốt thập niên 1980.Hầu hết các máy vi tính (micro-computer) buổi đầu chủ yếu vận hành bằng hợp ngữ, bao gồm các hệ điều hành và các ứng dụng lớn. Lý do là bởi các hệ thống này bị hạn chế về tài nguyên, thiết bị, bộ nhớ và kiến trúc hiển thị cũng như các dịch vụ hệ thống dễ lỗi. Lý do quan trọng hơn, có lẽ là sự thiếu hụt các trình biên dịch bậc cao tiên tiến vốn thích hợp cho các hệ thống vi tính. Các ứng dụng lớn viết bằng hợp ngữ điển hình như hệ điều hành CP/MMS-DOS, bảng tính spreadsheetLotus-123 trong các máy IBM-PC đời đầu, và nhiều các trò chơi phổ biến cho máy Commodore 64. Thậm chí tới những năm 1990, nhiều các trò chơi video giải trí vẫn được viết bằng hợp ngữ, bao gồm các trò chơi cho máy Mega Drive/GenesisSuper Nintendo Entertainment System.

Ngoài ra còn một dạng "ứng dụng" không được khuyến khích đó là virus máy tính. Trong các những năm '80 và đầu những năm '90 hầu hết virus máy tính được viết bằng hợp ngữ, lý do là sự giảm thiểu kích thước của virus cũng như khả năng can thiệp sâu vào hệ thống của hợp ngữ.

Hiện nay

Đã từng có nhiều tranh luận về tiện dụng và hiệu năng của hợp ngữ so với các ngôn ngữ bậc cao, tuy ngày nay người ta ít chú ý tới điều đó nữa. Hợp ngữ vẫn đóng vai trò quan trọng trong một số nhu cầu cần thiết. Nói chung, các trình biên dịch hiện đại ngày nay đều có khả năng biên dịch các ngôn ngữ bậc cao thành mã mà có thể thực thi nhanh ít nhất bằng hợp ngữ. Độ phức tạp của các bộ vi xử lý hiện đại cho phép tối ưu mã một cách hiệu quả, hơn nữa, phần lớn thời gian hoạt động của CPU rơi vào trạng thái rỗi bởi nó phải đợi kết quả từ cá các tính toán "thắt cổ chai" như các thao tác I/O và truy xuất bộ nhớ. Vì thế tốc độ thực thi mã thô (raw code) trở thành vấn đề ít quan trọng đối với hầu hết lập trình viên, sự xuất hiện các ngôn ngữ thông dịch (interpreted language) ngày càng nhiều là một minh chứng cho điều này.

Ngày nay có một số ít tình huống mà các chuyên gia thực sự muốn dùng hợp ngữ cho công việc của họ là:

  • Khi các thiết bị hoạt động độc lập mà không cần tài nguyên hay các thư viện liên kết với ngôn ngữ bậc cao. Đây có lẽ là trường hợp phổ biến nhất
  • Khi cần giao tiếp trực tiếp với phần cứng như trình điều khiển thiết bị, hoặc khi muốn dùng các chỉ thị vi xử lý mà trình biên dịch không tận dụng được
  • Khi cần tối ưu khắt khe như các thuật toán có dùng vòng lặp tiêu tốn nhiều năng lực xử lý
  • Khi một hệ thống cần phải viết mã thủ công để tận dụng nguồn tài nguyên hạn hẹp. Ngày nay điều đó có vẻ không phổ biến nữa do giá cả CPU giảm đồng thời hiệu năng hoạt động CPU đã cải thiện đáng kể.
  • Khi các ngôn ngữ bậc cao không thể áp dụng được trên một CPU mới hoặc CPU chuyên dụng.

Ngày nay lập trình viên có thể chọn một ngôn ngữ cấp thấp như C để viết các ứng dụng cần hiệu năng cao, tuy điều đó không dễ dàng bởi một ứng dụng viết bằng C sẽ không hiểu quả hơn ứng dụng viết bằng hợp ngữ. Ngoài ra, hợp ngữ vẫn còn được giảng dạy trong hầu hết các chương trình Khoa học máy tính, các khái niệm nền tảng vẫn có ý nghĩa quan trọng. Chẳng hạn như số học nhị phân, cấp phát bộ nhớ, xử lý ngăn xếp, mã hóa tập ký tự, xử lý ngắtthiết kế trình dịch vẫn được nghiên cứu một cách chi tiết và hệ thống bất kể phần cứng máy tính hoạt động như thế nào. Cách hoạt động của máy tính được xác định bởi tập lệnh cơ sở của nó, vì vậy để hiểu các khái niệm cơ sở đó cách tốt nhất là nghiên cứu hợp ngữ của nó. May thay, hầu như các máy tính hiện đại đều có các tập lệnh tương tự nhau, do đó chỉ nắm được một hợp ngữ cũng có đủ để hiểu được các khái niệm cơ bản ở các hợp ngữ trên hệ thống khác.

Các ứng dụng điển hình

Hợp ngữ mã cấp thấp thường được dùng cho BIOS lưu trong ROM của một hệ thống để khởi tạo và kiểm tra phần cứng hệ thống trước khi khởi tạo hệ điều hành. Khi khởi tạo phần cứng hoàn thành, quyền điều khiển hệ thống sẽ được chuyển qua cho các phần mã thự thi khác (thường được viết bằng ngôn ngữ bậc cao). Điều này cũng đúng cho hầu hết các trình khởi động (boot loader).

Nhiều trình biên dịch chuyển đổi các ngôn ngữ bậc cao thành hợp ngữ trước khi biên dịch thực sự, điều này cho phép kiểm tra mã phục vụ mục đích gỡ rối và tối ưu. Các ngôn ngữ cấp thấp như C thường cung cấp các cú pháp đặc biệt cho phép nhúng trực tiếp hợp ngữ vào mã nguồn. Các chương trình tận dụng tính năng này như Nhân Linux có thể tạo ra các tầng trừu tượng để sử dụng trên nhiều kiến trúc phần cứng khác nhau.

Hợp ngữ cũng có giá trị trong kỹ thuật dịch ngược (reverse engineering). Các chương trình lớn vốn chỉ được phân phối dưới dạng mã máy, chúng thường dễ dàng dịch ngược thành hợp ngữ để kiểm tra nhưng rất khó dịch ngược ra mã ngôn ngữ bậc cao.